package com.nan.hrm.service.impl;

import com.nan.hrm.dto.SmsCodeDto;
import com.nan.hrm.service.IVerifyCodeService;
import com.nan.hrm.util.StrUtils;
import com.nan.hrm.util.ValidUtils;
import com.nan.hrm.util.VerifyCodeUtils;
import com.nan.hrm.util.exception.GlobalException;
import com.nan.hrm.vo.SMSCodeRedisVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.MissingFormatArgumentException;
import java.util.concurrent.TimeUnit;

@Service
public class VerifyCodeServiceImpl implements IVerifyCodeService {
    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public String createVerifyCode(String imageCodeKey) {
        //1.判断key不为空
        ValidUtils.assertNotNull(imageCodeKey,"无效的key");
        //2.使用工具类生成一个图片验证码的值
        String generateVerifyCode = VerifyCodeUtils.generateVerifyCode(4);
        //3.把验证码的值存储到Redis,以前台传入的key作为key
        redisTemplate.opsForValue().set(imageCodeKey,generateVerifyCode,5, TimeUnit.MINUTES);
        //4.把验证码的值合并到图片
        String verifyCodebase = VerifyCodeUtils.verifyCode(140, 40, generateVerifyCode);
        //5.把图片使用Base64编码
        //6.返回base64编码的字符串
        return verifyCodebase;
    }

    @Override
    public String sendSmsCode(SmsCodeDto smsCodeDto) {
        //1.参数判断
        String mobile = smsCodeDto.getMobile();
        String imageCode = smsCodeDto.getImageCode();
        String imageCodeKey = smsCodeDto.getImageCodeKey();
        //2.判断图片验证码：
        // 2.1.根据前段传入的key去Redis获取图片验证码的值，
        String imageCodeInredis = (String) redisTemplate.opsForValue().get(imageCodeKey);
        // 2.2.传入的图片验证码的值和Redis中的值比较
        if(!imageCodeInredis.equalsIgnoreCase(imageCode)){
            throw new GlobalException("图片验证码不正确");
        }
        //3.获取上一次短信验证码发送记录
        SMSCodeRedisVo smscodevo = (SMSCodeRedisVo) redisTemplate.opsForValue().get(SMSCodeRedisVo.SMS_CODE_KEY_REG + mobile);
        //3.1.上一次有
        if(smscodevo!=null){
            if(new Date().getTime() - smscodevo.getDate().getTime() > 60 * 1000){
                redisTemplate.opsForValue().set(SMSCodeRedisVo.SMS_CODE_KEY_REG + mobile,
                        new SMSCodeRedisVo(smscodevo.getSmscode(),new Date()),
                5, TimeUnit.MINUTES);
                //调用短信api接口
                return smscodevo.getSmscode();
            }else{
                throw new GlobalException("请不要频繁操作!");
            }
        }
        //3.1.1.判断时候是否过了重发时间 ：当前时间 - 上一次发送时间 > 60s
        //3.1.2.如果没过重发时间 - 报错
        //3.1.3.如果过了重发时间 ，获取上一次验证码的值

        //3.2.上一次没有
        //3.2.1.创建一个手机验证码
        String smsCode = StrUtils.getRandomString(4);
        //4.把手机验证码发送记录存储到Redis(存储一个对象，对象里面包括验证码和存储时间)
        //先定义一个key
        String SMSCodekey = SMSCodeRedisVo.SMS_CODE_KEY_REG + mobile;
        //再定义一个value
        SMSCodeRedisVo smsCodeRedisVo = new SMSCodeRedisVo(smsCode, new Date());
        //将验证码存到redis中
        redisTemplate.opsForValue().set(SMSCodekey,smsCodeRedisVo,5,TimeUnit.MINUTES);
        //5.调用短信网关发送手机验证码
        //6.存储验证码的发送记录到Mysql
        return smsCode;
    }

}
